package github.ziwukun.jsonql.lang;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

class JSONQLJson {
	static JSONQL readJson(String json) {
		if(!JSONUtil.isJsonObj(json)) {
			throw new JsonQLFormatException("JsonQL对象解析错误，字符串不是一个合法的JSON字符串",
				"Json语法解析错误-" + json);
		}
		// 构建JSON对象方便解析
		JSONObject JSON = new JSONObject(json);
		
		// 解析@select语句
		Object selectObj = JSON.get("@select");
		if(selectObj == null) {
			throw new JsonQLFormatException("JsonQL对象解析错误，@select语句是必填语句",
				"Json语法解析错误:@select语句是必填语句");
		}
		Select select = SelectJson.readJson(selectObj.toString());
		
		// 解析@from语句
		Object fromObj = JSON.get("@from");
		if(fromObj == null) {
			throw new JsonQLFormatException("JsonQL对象解析错误，@from语句是必填语句",
				"Json语法解析错误:@from语句是必填语句");
		}
		if(!(fromObj instanceof String)) {
			throw new JsonQLFormatException("JsonQL对象解析错误，@from语句值类型必须是字符串",
				"Json语法解析错误:@from语句是类型必须是字符串");
		}
		String from = fromObj.toString();
		
		// 解析@where语句
		Object whereObj = JSON.get("@where");
		Where where = null;
		if(whereObj != null) {
			where = WhereJson.readJson(whereObj.toString());
		}
		
		// 解析@limit语句
		Object limitObj = JSON.get("@limit");
		Limit limit = null;
		if(limitObj != null) {
			limit = LimitJson.readJson(limitObj.toString());
		}
		
		// 解析@sort语句
		Object sortObj = JSON.get("@sort");
		Sort sort = null;
		if(sortObj != null) {
			sort = SortJson.readJson(sortObj.toString());
		}
		
		return new JSONQLImpl(select, from, where, limit, sort);
	}
	
	static String writeJson(JSONQLImpl jq) {
		JSONObject JSON = new JSONObject(true);
		JSON.set("@select",new JSONArray(jq.select.toJSONQL()));
		JSON.set("@from",jq.from());
		
		if(jq.where != null) {
			JSON.set("@where",new JSONObject(jq.where.toJSONQL()));
		}
		if(jq.limit != null) {
			JSON.set("@limit",new JSONObject(jq.limit.toJSONQL()));
		}
		if(jq.sort != null) {
			JSON.set("@sort",new JSONObject(jq.sort.toJSONQL()));
		}
		
		return JSON.toString();
	}
}
